home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
hity wydania
/
Ubuntu 9.10 PL
/
karmelkowy-koliberek-desktop-9.10-i386-PL.iso
/
casper
/
filesystem.squashfs
/
usr
/
bin
/
im-switch
< prev
next >
Wrap
Text File
|
2008-01-08
|
14KB
|
407 lines
#!/bin/sh
# Copyright (C) 2006 Osamu Aoki <osamu@debian.org>
# Copyright (C) 2005 - 2006 Kenshi Muto <kmuto@debian.org>
# Modified for Debian package.
# Copyright (C) 1999 - 2004 Red Hat, Inc. All rights reserved. This
# copyrighted material is made available to anyone wishing to use, modify,
# copy, or redistribute it subject to the terms and conditions of the
# GNU General Public License version 2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# system wide configuration directory
XINPUT_PATH=/etc/X11/xinit/xinput.d
# user specific customization directory
DOTXINPUT_PATH=${HOME}/.xinput.d
# All im-switch related alternatives start with xinput-
ALTER_XINPUT=/etc/alternatives/xinput-
# location for special hook scripts installed by each IM packages
HOOKDIR=/usr/share/im-switch
# $LNG is locale <languag>e_<region> without .<encoding> and .<encoding>@EURO
LNG=${LC_ALL:-${LC_CTYPE:-${LANG}}}
LNG=${LNG%@*}
LNG=${LNG%.*}
[ -z "$LNG" ] && LNG="all_ALL" || true
USERID=$(id -u)
VER=0.3+debian1.10
VERBOSE=0
# echo to STDERR when VERBOSE is on.
vecho() {
if [ $VERBOSE -eq 1 ] ; then
echo "$1" >&2
fi
}
# echo local setups to STDERR when VERBOSE is on.
vlang() {
if [ $VERBOSE -eq 1 ] ; then
echo "LC_ALL=\"$LC_ALL\"" >&2
echo "LC_CTYPE=\"$LC_CTYPE\"" >&2
echo "LANG=\"$LANG\"" >&2
echo "LNG=\"$LNG\"" >&2
fi
}
# echo command line info to STDERR when VERBOSE is on.
errcmd() {
echo "Error: \"${0##*/}\" invoked with \"$ORGAT\" as options." >&2
echo "Error: Try \"${0##*/} -h\" for usage." >&2
}
# echo missing dependency information for $1=$LNG
dependency() {
if [ -z "$1" ] ; then
return
fi
if [ -r ${HOME}/$(basename "$1") ]; then
DEPENDS=$(grep -e "DEPENDS=" ${HOME}/$(basename $1) | sed -e 's/DEPENDS=//' -e 's/"//g')
elif [ -r "${XINPUT_PATH}/$1" ]; then
DEPENDS=$(grep -e "DEPENDS=" $XINPUT_PATH/$1 | sed -e 's/DEPENDS=//' -e 's/"//g')
else
DEPENDS=""
fi
vecho "From the package dependency information requires"
vecho " \"$DEPENDS\"."
if [ -z "$DEPENDS" ]; then
return
fi
RESULT=""
# split with ","
IFS=","
for i in `echo "$DEPENDS"`; do
INSTALLED=0
# split with |
IFS="|"
for j in `echo "$i"`; do
unset IFS
vecho "checking status of \"$j\" package"
if dpkg -s $j 2>/dev/null | grep -q -e "Status: install ok installed" ; then
vecho "+++ \"$j\" package is installed."
INSTALLED=1
else
vecho "---- \"$j\" package is NOT installed."
fi
done
done
if [ $INSTALLED -eq 0 ]; then
if [ -z "$RESULT" ]; then
RESULT="( $i )"
else
RESULT="${RESULT} and ( $i )"
fi
fi
if [ -n "$RESULT" ]; then
echo "Please install following packages:"
echo " $(echo \"$RESULT\" | sed -e 's/|/ or /g') ."
fi
}
# echo current system wide default IM setup name
current_system_im () {
if [ -r "${ALTER_XINPUT}${LNG}" ]; then
/usr/sbin/update-alternatives --display xinput-$LNG | \
sed -ne 's/ link currently points to \(.*\)/\1/p' | \
sed -e "s%${XINPUT_PATH}/%%"
elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
/usr/sbin/update-alternatives --display xinput-all_ALL | \
sed -ne 's/ link currently points to \(.*\)/\1/p' | \
sed -e "s%${XINPUT_PATH}/%%"
else
echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
exit 1
fi
}
# echo current user IM setup name
current_user_im () {
readlink ${DOTXINPUT_PATH}/$LNG | \
sed -e "s%${XINPUT_PATH}/%%" -e "s%${DOTXINPUT_PATH}/%~/.xinput.d/%"
}
# echo IM setup candidates
possible_im () {
( (/usr/bin/find $XINPUT_PATH -type f| sed -e "s%$XINPUT_PATH/%%") ; \
(/usr/bin/find $DOTXINPUT_PATH -type f| sed -e "s%$DOTXINPUT_PATH/%%" ; ) ) | \
sort -u
# XXX FIXME : should test for executable
}
# run system hook script when system wide IM setup is changed
# So far, I have not see its use yet.
# $PREVIOUS
# $DEFAULT
runhookscripts () {
if [ "$DEFAULT" != "$PREVIOUS" ]; then
[ "$PREVIOUS" -a -x "$HOOKDIR/$PREVIOUS" ] && $HOOKDIR/$PREVIOUS remove
[ "$DEFAULT" -a -x "$HOOKDIR/$DEFAULT" ] && $HOOKDIR/$DEFAULT install
fi
}
list() {
echo "Your input method setup under $LNG locale as below."
echo "======================================================="
if [ "$USERID" -eq 0 ]; then
echo "No private configuration can be defined for root account."
elif [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
if [ -L "${DOTXINPUT_PATH}/${LNG}" ]; then
echo "The configuration \"${DOTXINPUT_PATH}/${LNG}\" is defined as a link pointing to"
echo "$(basename $(readlink "${DOTXINPUT_PATH}/${LNG}"))"
else
echo "The private configuration is a static file \"${DOTXINPUT_PATH}/${LNG}\" ."
fi
echo "This private configuration supersedes the system wide default."
elif [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
if [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
echo "The configuration \"${DOTXINPUT_PATH}/all_ALL\" is defined as a link pointing to"
echo "$(basename $(readlink "${DOTXINPUT_PATH}/all_ALL"))"
else
echo "The private configuration is a static file \"${DOTXINPUT_PATH}/all_ALL\" ."
fi
echo "This private configuration supersedes the system wide default."
else
echo "No private \"${DOTXINPUT_PATH}/${LNG} or ${DOTXINPUT_PATH}/all_ALL\" is defined."
fi
echo "======================================================="
if [ -r "${ALTER_XINPUT}${LNG}" ]; then
echo "The system wide default is pointed by \"${ALTER_XINPUT}${LNG}\" ."
/usr/sbin/update-alternatives --display xinput-$LNG | sed -e "s%$XINPUT_PATH/%%"
elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
echo "The system wide default is pointed by \"${ALTER_XINPUT}all_ALL\" ."
/usr/sbin/update-alternatives --display xinput-all_ALL | sed -e "s%$XINPUT_PATH/%%"
else
echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
fi
vecho "======================================================="
vecho "The system wide default input methods are available for the locales:"
for i in `/bin/ls $ALTER_XINPUT* | sed -e "s%$ALTER_XINPUT%%"`; do
vecho -n "$i "
done
vecho
echo "======================================================="
echo "The available input method configuration files are:"
for i in `possible_im` ; do
if [ -r $DOTXINPUT_PATH/$i ]; then
echo -n "~/.xinput.d/$i "
else
echo -n "$i "
fi
done
echo
vecho "======================================================="
vecho "The available input method hook scripts are in $HOOKDIR:"
for i in `/usr/bin/find $HOOKDIR -type f| sed -e "s%$HOOKDIR/%%"`; do
vecho -n "$i "
done
vecho
echo "======================================================="
}
# set IM to defaults
auto() {
if [ "$USERID" -eq 0 ]; then
if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
echo "No system wide default defined just for locale ${LNG} ."
echo "Use \"all_ALL\" quasi-locale and set IM."
LNG="all_ALL"
fi
PREVIOUS=$(current_system_im)
/usr/sbin/update-alternatives --auto xinput-$LNG
else
if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
PREVIOUS=$(current_user_im)
mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
fi
fi
DEFAULT=$(current_system_im)
dependency $DEFAULT
runhookscripts
}
# set im setup pointing to to $1 script in $XINPUT_PATH
setalt() {
if [ "$USERID" -eq 0 ]; then
vecho "You are root user."
# sanity check
if [ ! -r "$XINPUT_PATH/$1" ] ; then
echo "Error: no system wide configuration file \"$1\" exists." >&2
echo "Error: No action taken." >&2
exit 1
fi
if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
echo "No system wide default defined just for locale $LNG ."
echo "Use \"all_ALL\" quasi-locale and set IM."
LNG="all_ALL"
fi
PREVIOUS=$(current_system_im)
/usr/sbin/update-alternatives --set xinput-$LNG $XINPUT_PATH/${1}
DEFAULT=$(current_system_im)
vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
else
# sanity check
if [ ! -r "$XINPUT_PATH/${1}" -a ! -r "$DOTXINPUT_PATH/${1}" ] ; then
echo "Error: no configuration file \"${1}\" exists." >&2
echo "Error: No action taken." >&2
exit 1
fi
vecho "You are non-root user."
if [ ! -d ${DOTXINPUT_PATH} ]; then
mkdir -p ${DOTXINPUT_PATH}
vecho "Creating ${DOTXINPUT_PATH} directory."
fi
if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
PREVIOUS=$(current_user_im)
mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
vecho "Backed up user configuration pointing to $PREVIOUS."
fi
if [ -r "$DOTXINPUT_PATH/${1}" ] ; then
ln -s $DOTXINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
else
ln -s $XINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
fi
DEFAULT=$(current_user_im)
vecho "Set user configuration pointing to $DEFAULT."
fi
dependency "$DEFAULT"
runhookscripts
}
# set im setup pointing to to a script in $XINPUT_PATH by menu
cfgalt() {
if [ "$USERID" -eq 0 ]; then
vecho "You are root user."
if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
echo "No system wide default defined just for locale $LNG ."
echo "Use \"all_ALL\" quasi-locale and set IM."
LNG="all_ALL"
fi
PREVIOUS=$(current_system_im)
echo "System wide default for ${LNG} locale is marked with [+]."
/usr/sbin/update-alternatives --config xinput-$LNG
DEFAULT=$(current_system_im)
vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
else
vecho "You are non-root user."
if [ ! -d ${DOTXINPUT_PATH} ]; then
mkdir -p ${DOTXINPUT_PATH}
vecho "Creating ${DOTXINPUT_PATH} directory."
fi
PREVIOUS_SYS=$(current_system_im)
if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
PREVIOUS_USR=$(current_user_im)
cp -a ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
vecho "Backed up user configuration pointing to $PREVIOUS."
fi
vecho " PREVIOUS_SYS=\"$PREVIOUS_SYS\""
vecho " PREVIOUS_USR=\"$PREVIOUS_USR\""
COUNT=`possible_im | wc -l`
echo
echo "There are $COUNT candidates which provide IM for ${DOTXINPUT_PATH}/${LNG}:"
echo
echo " Selection Alternative"
echo " -----------------------------------------------"
INDEX=0
for i in `possible_im`; do
INDEX=$(($INDEX+1))
if [ -r $DOTXINPUT_PATH/$i ]; then
if [ "$PREVIOUS_USR" = "~/.xinput.d/$i" ]; then
echo -n "*"
else
echo -n " "
fi
if [ "$PREVIOUS_SYS" = "~/.xinput.d/$i" ]; then
echo -n "+"
else
echo -n " "
fi
echo " $INDEX ~/.xinput.d/$i "
else
if [ "$PREVIOUS_USR" = "$i" ]; then
echo -n "*"
else
echo -n " "
fi
if [ "$PREVIOUS_SYS" = "$i" ]; then
echo -n "+"
else
echo -n " "
fi
echo " $INDEX $i"
fi
done
echo "System wide default for ${LNG} (or all_ALL) locale is marked with [+]."
echo -n "Press enter to keep the current selection[*], or type selection number: "
read SEL
echo
if [ -z "$SEL" ]; then
SEL=0
fi
INDEX=0
for i in `possible_im`; do
INDEX=$(($INDEX+1))
if [ "$SEL" -eq "$INDEX" ]; then
if [ -r "$DOTXINPUT_PATH/$i" ] ; then
ln -fs $DOTXINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
else
ln -fs $XINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
fi
fi
done
fi
DEFAULT=$(current_user_im)
vecho "Set user configuration pointing to $DEFAULT."
dependency "$DEFAULT"
runhookscripts
}
help() {
echo "Input Method Switcher $VER"
echo ""
echo "\"${0##*/}\" configures the input method to be automatically switched based "
echo "on the locale (ll_CC) using Debian \"update-alternatives\" mechanism."
echo "When \"${0##*/}\" is invoked from root user, it sets system wide alternatives."
echo ""
echo "Usage: ${0##*/} [-v][-z ll_CC] -s inputmethodname"
echo " to set a specific input method for the language"
echo " ${0##*/} [-v][-z ll_CC] -c"
echo " to set an input method for the language by menu"
echo " ${0##*/} [-v][-z ll_CC] -a"
echo " to revert to the default input method for the language"
echo " ${0##*/} [-v][-z ll_CC] -l"
echo " to list current settings and available input methods for"
echo " the language, and also all the available languages"
echo " ${0##*/} -h"
echo " to show this help"
echo ""
echo "The \"ll_CC\" argument of -z takes the form \"<language>_<teritory>\" and "
echo "is used to override the current locale (ISO 639 / ISO 3188) : eg \"-z ja_JP\""
echo ""
echo "The use of -v option produces verbose outputs."
echo ""
}
ORGAT="$@"
while getopts "vfz:als:ch" OPTION; do
case $OPTION in
v) VERBOSE=1;;
z) vlang; LNG="$OPTARG"; LNG=${LNG%@*}; LNG=${LNG%.*};;
a) vlang; auto; exit 0;;
l) vlang; list; exit 0;;
s) vlang; setalt "$OPTARG"; exit 0;;
c) vlang; cfgalt; exit 0;;
h) vlang; help; exit 0;;
?) errcmd; exit 1;;
esac
done
# If no option or only with -d or/and -z
errcmd
exit 1